 #! /bin/sh
<<!
简单的封装了一个简单的日志shell工具。
step1: 解析具体的日志级别，确定比当前级别的日志一定会被输出.
step2: 处理日志输出内容，统一日志格式。
step3: 自定义日志展示方式,确定日志持久化或者展示方式。
!
#=========================================
#============     参数定义     ===========
#=========================================
logFlag=$(echo -e  "\036\036\037");     #记录当前内容由日志工具输出
default_logLevel=1                      #默认日志级别
logLevel=$default_logLevel              #当前脚本设置的日志级别
logSelf=0;                              #是否记录日志脚本执行过程中产生的信息
LOGGERS=(DEBUG INFO WARN ERR)           #支持的日志级别集合
N_LOGGERS=('1'  '2'  '3'  '4')                     #日志级别对应的数值
#打印自身日志信息
function out(){
  if [ $logSelf -eq 1 ]
    then echo "log:out:$*";
  fi 
}

#处理字符串首尾的空格
function trim(){
  echo $1 | awk '{sub(/^ */,"");sub(/ *$/,"")}1';
}
#根据日志级别获取对应的数值
function getLoggerNum(){
#  out "执行getLoggerNum方法...";
#  out "getLoggerNum:所有参数:$*"
  l_default=-1; #默认DEBUG级别日志
  l_level=$l_default;     #赋默认值
  l_conut=0;            #指针
  #循环获取日值级别对应的数值
  for log in ${LOGGERS[*]}
    do 
      logInfo=$(echo "$1" |grep -io "$log");#获取当前内容是否包含了日志级别
      if [ "$logInfo" == "$log"  ] 
        then  
#        out "日志级别集合:${N_LOGGERS[*]}"
#        out "日志级别索引:$l_count"
        l_level=${N_LOGGERS[l_conut]};
#       out "表达式日志级别:${N_LOGGERS[l_conut]}"
#       out "日志级别:$l_level"
         break;
      fi
    let l_conut++;
  done
  echo $l_level;
}
#确定日志级别
function setLogLevel(){
  #获取参数日志
  logLevel=$(getLoggerNum $1);
}
#debug级别日志
function debug(){
  echo -e "\n$1\t\t$2\t$3";
}
#信息级别日志
function info(){
  echo -e "\n$1\t\t\033[42;37m $2 \033[0m\t$3";
}
#警告级别日志
function warn(){
  echo -e "\n$1\t\t\033[43;37m $2 \033[0m\t$3"
}
#错误级别日志
function err(){
  echo -e "\n$1\t\t\033[41;37m $2 \033[0m\t$3"
}
#截取日志内容格式化日志格式。
function handlerLog(){
  content=$*;                           #保存日志内容
  out "handlerLog:contet[1]:$content"
  contentArr=($content);                #将日志内容转换成数组
  out "handlerLog:arr:size:${#contentArr[*]}"
  contentDate=${contentArr[0]};         #获取日志时间戳
  out "handlerLog:$contentDate"
  contentLevel=${contentArr[1]}         #获取日志级别
  out "handlerLog:level:$contentLevel"
  re_contentDate=$contentDate;          #格式化后的日志级别
  out "handlerLog:re_contentDate:$re_contentDate"
  out "handlerLog:content[2]:$content"
  content=$(echo $content | sed  "s/${contentDate}//1")
                                        #删除原有日志内容中的时间戳。
  out "handlerLog:content[3]:$content"
  re_contentLevel=$contentLevel;        #格式化后的日志内容
  out "handlerLog:re_contentLevel:$re_contentLevel"
  content=$(echo $content | sed  "s/${contentLevel}//1")
  out "handlerLog:content[4]:$content"
  re_contentDetail=$content$logFlag;            #具体的日志内容
  out "handlerLog:re_contentDetail:$re_contentDetail"
  out "日志级别:$currentLogLevel:$logLevel"
  ###格式化然后拼接日志
  if [ $currentLogLevel -ge $logLevel ]
    then
      case  $currentLogLevel in
        1 )
          debug "$re_contentDate" "$re_contentLevel" "$re_contentDetail";
        ;;
        2 )
          info "$re_contentDate" "$re_contentLevel" "$re_contentDetail";
        ;;
        3 )
          warn "$re_contentDate" "$re_contentLevel" "$re_contentDetail";
        ;;
        4 )
          err "$re_contentDate" "$re_contentLevel" "$re_contentDetail";
        ;;
        * )
          debug "$re_contentDate" "$re_contentLevel" "$re_contentDetail";
        ;;
      esac
  fi
  
}
#日志记录入口
function log (){
  out "第一个参数:$1"
  out "所有参数:$*"
  content=$(trim "$*");                                 #获取日志内容
  out "截取后所有参数:$content"
  out "${#content[*]}"
  content_header=$1;                                    #获取日志第一个内容
  out "日志级别:$content_header" 
  currentLogLevel=$(getLoggerNum $content_header);      #判断当前日志级别
  out "日志等级:$currentLogLevel"
  if [ 0 -gt $currentLogLevel ]
    then 
      content="DEBUG\t"$content;                        #给内容添加日志级别信息
      currentLogLevel=1;                                #给内容添加日志级别
  fi
  content=$(echo -e "`date -d today +"%Y年%m月%d日-%T:ms=%N"`\t$content") #给日志添加时间戳
  out "$content"
  handlerLog $content
  #将日志的展示交给具体的对应的方法来处理。
  
}
#暴露方法
log $*
